package com.sprouting.personal.annotations.impl;

import com.sprouting.personal.annotations.CheckLength;
import com.sprouting.personal.interfaces.common.Constant;
import lombok.extern.slf4j.Slf4j;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.UnsupportedEncodingException;

/**
 * 字段长度检查，数据库标准 实现
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/7/28 0:19
 */
@Slf4j
public class CheckLengthValidator implements ConstraintValidator<CheckLength, String> {

    /**
     * 默认的字段长度
     */
    private int min = 0;
    private int max = Integer.MAX_VALUE;

    /**
     * 初始化方法
     * @param constraintAnnotation 注解
     */
    @Override
    public void initialize(CheckLength constraintAnnotation) {
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }

    /**
     * 校验方法
     * @param value 需要验证的值
     * @param context 校验的上下文
     * @return true 校验成功， false 不合法
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null || "".equals(value)){
            return true;
        }
        if (min < 0) {
            min = 0;
        }
        int vl;
        try {
            //转换为数据库的长度
            vl = value.getBytes(Constant.Encoded.UTF).length;
        } catch (UnsupportedEncodingException e) {
            log.error("校验数据长度发生异常，{}", e);
            return false;
        }

        if (min <= vl && vl <= max){
            return true;
        }

        return false;
    }



}
